package migrate

import (
	"gorm.io/gorm"
)

// migrationFunc 定义一个函数类型，用于执行数据库迁移操作。
type migrationFunc func(gorm.Migrator, *gorm.DB)

// migrationFiles 是一个切片，用于存储所有的迁移文件。
var migrationFiles []MigrationFile

// MigrationFile 定义一个结构体，用于存储迁移文件的信息。
// 其中，Up 字段是一个函数类型，用于执行迁移操作；Down 字段是一个函数类型，用于回滚迁移操作；FileName 字段是迁移文件的名称。
type MigrationFile struct {
	Up       migrationFunc // Up 方法用于执行迁移操作
	Down     migrationFunc // Down 方法用于回滚迁移操作
	FileName string        // FileName 用于存储迁移文件的名称
}

// Add 新增一个迁移文件，所有的迁移文件都需要通过这个函数来注册。
// up 和 down 分别是执行迁移和回滚操作的函数，fileName 是迁移文件的名称。
func Add(up, down migrationFunc, fileName string) {
	migrationFiles = append(migrationFiles, MigrationFile{
		Up:       up,
		Down:     down,
		FileName: fileName,
	})
}

// getMigrationFile 用于根据迁移文件的名称获取对应的 MigrationFile 结构体。
func getMigrationFile(name string) MigrationFile {
	for _, file := range migrationFiles {
		if file.FileName == name {
			return file
		}
	}
	return MigrationFile{}
}

func (file *MigrationFile) isNotMigrated(migrations []Migration) bool {
	for _, migration := range migrations {
		if migration.Migration == file.FileName {
			return false
		}
	}
	return true

}
